PHP Filter
PHP Wrapperの一種
php://read=読み込み時に使われるフィルタ/write=書き込み時に使われるフィルタ/どちらにも使われるフィルタ/resource=pathが基本
フィルタは|区切りで複数適用できる。read/writeフィルタはオプション
Filterを用いて様々な文字列処理が可能
Filter一覧 https://www.php.net/manual/en/filters.php
convert.base64-encode
Local File Inclusionがあるが、フラグフォーマットがレスポンスに含まれていると弾くWAFがあるときに使える
convert.iconv.*
iconvによる変換ができる
string.strip_tags
PHP8未満で使える
Filterを利用して任意の文字列を含む文字列を生成できる黒魔術テクニックがある
php_filter_chain_generator https://github.com/synacktiv/php_filter_chain_generator
解説: https://www.synacktiv.com/en/publications/php-filters-chain-what-is-it-and-how-to-use-it.html
convert.iconv.UTF8.CSISO2022KRを適用すると常に先頭に\x1b$)Cが生成されることを利用する
iconvで頑張って好きなbase64文字列を生成し、convert.base64-decodeに変換して任意の1文字を生成する
途中ごみが入ったりエラーになったりしないよう色々やる
これを頑張って繰り返すと上手いこと任意の文字列を生成できる...という原理
ただし、文字列の末尾にごみが入ってしまう問題がある
PHP8未満であればstring.strip_tagsを利用して末尾に<を入れることで消せる
ImaginaryDailyCTF - Filter Master https://imaginaryctf.org/ArchivedChallenges/35
これを利用してPHP Local File Inclusionは前提条件なしにRemote Code Executionができるようになった
エラーが起きたかどうかを判別できる場合、任意のファイルの内容を1文字ずつ漏洩させることができる
DownUnderCTF 2022 - minimal-phpで発表された手法
https://github.com/DownUnderCTF/Challenges_2022_Public/blob/main/web/minimal-php/solve/solution.py
PHPが扱えるファイルサイズの上限を超えるとエラーが起きる挙動と、dechunk filterを組み合わせてオラクルを構築する
Synacktivによる解説: https://www.synacktiv.com/publications/php-filter-chains-file-read-from-error-based-oracle